<#
MySQL 服务稳定性与应用启动影响快速诊断脚本
使用说明（管理员 PowerShell）：
1. 关闭当前 Flask / run.ps1（确保应用未占用连接）
2. 以管理员身份打开 PowerShell，进入项目根目录（含 scripts\collect_mysql_diag.ps1）
3. 执行:  .\scripts\collect_mysql_diag.ps1 -User dev01 -Password 123456 -Host 127.0.0.1 -Port 3306
4. 脚本会：
   - 启动 MySQL80 服务（若未启动）
   - 进行 60 秒空闲探测 (每秒 SELECT 1)
   - 暂停等待你手动启动 run.ps1 或 python app_dev.py
   - 发生 2003 连接失败后按 Enter，脚本收集 服务状态 + 错误日志尾部 200 行
5. 将输出目录 mysql_diag_时间戳 下的文件打包或贴出关键内容。

注意：诊断完成后，生成的 mysql_diag_时间戳 目录可以删除，避免积累过多历史诊断数据。

参数可调：-IdleSeconds 默认 60；-AttemptsPerSecond 默认 1。
#>
param(
    [string]$ServiceName = 'MySQL80',
    [string]$User = 'dev01',
    [string]$Password = '123456',
    # 避免与 PowerShell 只读自动变量 $Host 冲突，改名为 DbHost
    [string]$DbHost = '127.0.0.1',
    [int]$Port = 3306,
    [int]$IdleSeconds = 60,
    [int]$AttemptsPerSecond = 1,
    [switch]$SkipIdle
)

function Write-Head($msg){ Write-Host "`n==== $msg ====\n" -ForegroundColor Cyan }

$ts = Get-Date -Format "yyyyMMdd_HHmmss"
$logDir = Join-Path $PSScriptRoot "mysql_diag_$ts"
New-Item -ItemType Directory $logDir | Out-Null

Write-Head "STEP1 服务启动与基础信息"
sc qc $ServiceName | Tee-Object "$logDir/service_qc.txt"
try {
    Start-Service $ServiceName -ErrorAction SilentlyContinue
} catch { }
sc query $ServiceName | Tee-Object "$logDir/service_state_start.txt"

# 尝试定位错误日志目录（常规路径）
$defaultDataDir = 'C:\ProgramData\MySQL\MySQL Server 8.0\Data'
$errLog = $null
if (Test-Path $defaultDataDir){
    $errLog = Get-ChildItem $defaultDataDir -Filter *.err -ErrorAction SilentlyContinue | Sort-Object LastWriteTime -Descending | Select-Object -First 1
}
if($errLog){
    "Using error log: $($errLog.FullName)" | Tee-Object "$logDir/diag.log"
} else {
    "未自动定位到错误日志 (*.err)，请确认 datadir 路径" | Tee-Object "$logDir/diag.log"
}

if ($SkipIdle -or $IdleSeconds -le 0) {
    Write-Head "STEP2 跳过空闲稳定性探测 (SkipIdle)"
} else {
    Write-Head "STEP2 空闲稳定性探测 ($IdleSeconds 秒)"
    $probeFile = "$logDir/idle_probe.txt"
    for ($sec = 1; $sec -le $IdleSeconds; $sec++) {
        for($a=1; $a -le $AttemptsPerSecond; $a++) {
            $t = Get-Date -Format "HH:mm:ss.fff"
            $ok = $true
            try {
                & mysql -h$DbHost -P$Port -u$User -p$Password -e "SELECT 1;" *> $null
                $line = "$t OK sec=$sec/$IdleSeconds"
            } catch {
                $ok = $false
                $line = "$t FAIL sec=$sec/$IdleSeconds $_"
            }
            Write-Host $line
            $line | Tee-Object -Append $probeFile | Out-Null
            if (-not $ok){ break }
        }
        if (Select-String -Path $probeFile -Pattern "FAIL" -Quiet){ break }
        Start-Sleep -Seconds 1
    }
}

Write-Head "STEP3 在启动应用前再次记录服务状态"
sc query $ServiceName | Tee-Object "$logDir/service_state_before_app.txt"

Write-Host "现在请启动应用 (run.ps1 或 python app_dev.py)。" -ForegroundColor Yellow
Write-Host "看到应用日志里出现 2003/10061 后，切回此窗口直接按 Enter（不要输入文字）。" -ForegroundColor Yellow
Read-Host | Out-Null

Write-Head "STEP4 应用触发后采集状态"
sc query $ServiceName | Tee-Object "$logDir/service_state_after_app.txt"
netstat -ano | findstr ":$Port" | Tee-Object "$logDir/netstat_port.txt"

if ($errLog){
    Get-Content $errLog.FullName -Tail 200 | Tee-Object "$logDir/mysql_error_tail.txt"
}

Write-Head "完成"
Write-Host "输出目录: $logDir" -ForegroundColor Green
Write-Host "请将以下文件内容提供：" -ForegroundColor Green
Write-Host " service_qc.txt, service_state_start.txt, idle_probe.txt, service_state_before_app.txt, service_state_after_app.txt, mysql_error_tail.txt (若存在)" -ForegroundColor Green
